/*
 * @Author: daidai
 * @Date: 2022-02-23 08:59:26
 * @LastEditors: daidai
 * @LastEditTime: 2022-02-24 17:11:58
 * @FilePath: \big-screen-vue-datav\src\utils\index.js
 */

/**
 * @param {Function} fn 防抖函数
 * @param {Number} delay 延迟时间
 */
export function debounce(fn, delay) {
  var timer;
  return function () {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}
/**
 * @param {date} time 需要转换的时间
 * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time, fmt) {
  if (!time) return "";
  else {
    const date = new Date(time);
    const o = {
      "M+": date.getMonth() + 1,
      "d+": date.getDate(),
      "H+": date.getHours(),
      "m+": date.getMinutes(),
      "s+": date.getSeconds(),
      "q+": Math.floor((date.getMonth() + 3) / 3),
      S: date.getMilliseconds(),
    };
    if (/(y+)/.test(fmt))
      fmt = fmt.replace(
        RegExp.$1,
        (date.getFullYear() + "").substr(4 - RegExp.$1.length)
      );
    for (const k in o) {
      if (new RegExp("(" + k + ")").test(fmt)) {
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length === 1
            ? o[k]
            : ("00" + o[k]).substr(("" + o[k]).length)
        );
      }
    }
    return fmt;
  }
}

export function deepClone(obj) {
  // 检查 obj 是否为 null 或者不是对象
  if (obj === null || typeof obj !== "object") {
    return obj; // 直接返回基本类型的值
  }

  // 处理数组
  if (Array.isArray(obj)) {
    const arrCopy = []; // 创建一个新数组
    for (let item of obj) {
      arrCopy.push(deepClone(item)); // 递归复制每个元素
    }
    return arrCopy;
  }

  // 处理对象
  const objCopy = {}; // 创建一个新对象
  for (let key in obj) {
    // eslint-disable-next-line no-prototype-builtins
    if (obj.hasOwnProperty(key)) {
      // 确保是自有属性
      objCopy[key] = deepClone(obj[key]); // 递归复制每个属性
    }
  }
  return objCopy;
}

/**
 * @description 获取屏幕坐标
 * @author gaotang<qq23745038@126.com>
 * @date 2025-01-11 10:43
 * @export
 * @param {*} event
 * @param {string} [dom=".mapwrap"]
 * @return {*}
 */
export function getScreenPoint(event, dom = ".mapwrap") {
  const point = document.querySelector(dom).getBoundingClientRect();
  const w = point.width;
  const h = point.height;
  const clientWidth = Math.abs(event.clientX + 16);
  // const clientHeight = Math.abs(point.height - event.pageY) / 2; //event.screenY;
  const clientHeight = Math.abs(event.clientY + 10) / 4; //event.screenY;
  const scaleW = clientWidth / w;
  const scaleH = clientHeight / h;
  const x = parseInt(scaleW * 100);
  const y = parseInt(scaleH * 100);
  return {
    x: `${x}%`,
    x1: `${x + 7}%`,
    x11: `${x + 10}%`,
    x2: `${x + 14}%`,
    y: `${y}%`,
  };
  // return { x: `${point.top}px`, y: `${point.right}px` };
}

/**
 * Fisher - Yates 洗牌算法能对数组进行随机排序，然后选取前 num 个元素。
 *
 * @export
 * @param {*} arr
 * @param {*} num
 * @return {*} 
 */
export function getRandomElementsByShuffle(arr, num) {
  // 复制原数组，避免修改原数组
  let tempArr = [...arr]; 
  let len = tempArr.length;
  for (let i = len - 1; i > 0; i--) {
      // 生成一个 0 到 i 之间的随机索引
      let j = Math.floor(Math.random() * (i + 1)); 
      // 交换 tempArr[i] 和 tempArr[j] 的位置
      [tempArr[i], tempArr[j]] = [tempArr[j], tempArr[i]]; 
  }
  // 选取洗牌后数组的前 num 个元素
  return tempArr.slice(0, num); 
}